=======================================================================
JavaScript Obfuscation Procedures
=======================================================================


=======================================================================
ソースコードの部分挿入＆削除（partsEdit)
-----------------------------------------------------------------------
FTVコードの削除
"use strict"の削除
"js-log-stats"の削除
=======================================================================


=======================================================================
ストリング及びコメントの抽出
-----------------------------------------------------------------------
"..."
'...'
`...`
//...
/*...*/
=======================================================================


=======================================================================
ワードの分類方法 (Reserved Word, Replaceable Word, Mappable Word)
-----------------------------------------------------------------------

ワードの分類方法を考えてみる。以下のコードを例として使う。
-----------------------------------------------------------------------
for(i=0;i<n;i++){
	str+=chars.charAt($_window.Math.floor($_window.Math.random()*len));
}
-----------------------------------------------------------------------

以下にワードを列記してみる。(aaa.bbb.ccc のようにDotでつながっている場合は、
最初のワードだけを考慮する。)

------------------------
for
i
n
str
chars
$_window
len
------------------------
上記のワードの中で、for のみが Reserved Word であり、残りはすべて
Replaceable Word である。

------------------------
[rsw] Reserved Words : Reserved words, also known as keywords, are words in a programming language that have a predefined meaning and cannot be used as identifiers (variable names, function names, etc.) 

[rpw] Replaceable Words : Words you can replace with a random word without changing what the script does as long as you replace them consistenty.
------------------------

次に .(propety) を含む節を列記する。

------------------------
chars.charAt
$_window.Math.floor
$_window.Math.random
------------------------

.(propety) の型になる文字列を列記する。

------------------------
.charAt
.Math
.floor
.random
------------------------

.(propety) のワードは、Mappable Word である。

------------------------
[mpw] Mappable Words : ランダムなワードに交換することはできないが、
(key)=>(property) のマッピングを行い、.(propety) を ["(key)"] 
の形に置換することができる。
------------------------

=======================================================================


=======================================================================
Reserved Word, Replaceable Word, Mappable Word の判定方法
-----------------------------------------------------------------------
Wordが単独で現れた場合、それが Reserved Word かチェックする。
( for, while, if, catch, function ... )
Reserved Word でなければ、Replaceable Word である。
(先頭).(propety) のように、ワードがドットでつながれて現れた場合、
(先頭)が Replaceable Word で、(propety) が Mappable Word と判定できる。
-----------------------------------------------------------------------
しかし上記のルールに例外を作ることができる。

【例外１】$_ をワードの前に付けた場合、位置に関わらず、常に
Replaceable Word になる。
以下の例では、$_foo1 及び $_foo2 は Replaceable Word になる。
-------------
$_foo1
pax.$_foo2
-------------

【例外２】_$ をワードの後ろに付けた場合、位置に関わらず、常に
常に Mappable Word になる。
以下の例では、foo1_$ 及び foo2_$ は Mappable Word になる。
-------------
foo1_$
foo2_$.property
-------------

Reserved Word の判定だが、CJsObfus の中に、JavaScript の Reserved Words
のリストを持っている。さらに、addReservedWord() で追加することができる。
=======================================================================


=======================================================================
プレースホルダー
-----------------------------------------------------------------------
プレースホルダーのフォーマットは以下のようなになる。

\x01(INDEX)\x01

(INDEX)は０から始まり、新しいプレースホルダーを作るごとに＋１していく。
両脇が\x01で固められているのは、minimizeする時に役に立つからである。

すべてのワードは、プレースホルダーで置換される。'function'や'new'などの
Reserved Wordsも、プレースホルダーに置換される。最終的に
ソースコードは、プレースホルダーと ; + = / のような記号だけになる。
=======================================================================


=======================================================================
最小化 (minimize)
-----------------------------------------------------------------------
ソースコードを最小化するためには。。。

[(1) コメントの削除]

[(2) ホワイトスペースの標準化]
次に、ホワイトスペースの標準化(normalization)を行う。
2.1) \n, \r, \t のような、non-space を、通常のスペース(" ")に置換する。
2.2) 複数の連なったスペースを、通常の一つのスペース(" ")は置換する。

[(3) プレースホルダー間のスペースの一時退避]
プレースホルダー間のスペースを\x02に置換する。

例えば、"\x01(INDEX)\x01 \x01(INDEX+1)\x01"の場合、
"\x01(INDEX)\x01\x02\x01(INDEX+1)\x01"になる。

[(4) スペースの削除]
全スペースをソースコードから削除する。

[(5) プレースホルダー間のスペースの復元]
プレースホルダー間の\x02をスペースに戻す。
=======================================================================
